package thread;

/**
 * 多线程并发安全问题
 * 当多个线程并发操作同一临界资源由于线程切换时机不确定，导致执行顺序出现混乱从而导致不良后果
 * 临界资源：操作该资源的完成过程同一时刻只能被单一线程进行的
 */
public class SyncDemo {
    public static void main(String[] args) {
        Table table = new Table();
        Thread t1 = new Thread(){
        public void run () {
            while (true) {
                int bean = table.getBean();
                Thread.yield();
                System.out.println(getName() + ":" + bean);
            }
        }
    };

    Thread t2 = new Thread() {
        public void run() {
            while (true) {
                int bean = table.getBean();
                Thread.yield();
                System.out.println(getName() + ":" + bean);
            }
        }
    };
            t1.start();
            t2.start();
         }
    }

class Table {
    private  int beans = 20;//桌上有20个豆子
    /*
        在方法上使用synchronized关键字后，该方法称为“同步方法”。多个线程不能同时在方法内部执行
        将多个线程并发执行改为同步（有先后顺序）的执行可有效的解决并发安全问题
     */

    public synchronized int getBean() {
        if (beans == 0) {
            throw new RuntimeException("没有豆子了!");
        }
        Thread.yield();
        return beans--;
    }

}
